﻿using System;
using System.Collections.Generic;

namespace LAPI.Business.Acciones
{
    /// <summary>
    /// Clase para realizar la acción: validar si se puede actualizar los datos de un usuario
    /// </summary>
    public class AccValidarDatosModificacionUsuario
    {
        /// <summary>
        /// Logger de la clase
        /// </summary>
        private LAPI.Core.Logging.ILogger logger;

        /// <summary>
        /// Constructor
        /// </summary>
        public AccValidarDatosModificacionUsuario()
        {
            logger = LAPI.Core.Logging.LoggerFactory.CreateLogger(type: typeof(AccValidarDatosModificacionUsuario));
        }

        /// <summary>
        /// Método para realizar la acción de validar si se puede actualizar los datos de un usuario
        /// <p>
        /// El método realiza las siguientes funciones:
        /// <ul>
        /// <li>Comprueba que no falten campos necesarios</li>  
        /// <li>Comprueba el formato del DNI</li>
        /// <li>Comprueba el formato del Email</li>
        /// <li>Comprueba que no exista otro usuario con ese Email</li>
        /// <li>Comprueba que no exista otro usuario con ese DNI</li>        
        /// </ul>
        /// </p>
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos del usuario con los datos actualizados del usuario</param>
        /// <returns>ResultadoAccion, con el resultado de la operación</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorUsuarios"/>
        /// <seealso cref="StringExtension"/>
        /// <seealso cref="NumeroNif"/>
        /// <seealso cref="CompruebaMail"/>
        /// <seealso cref="ResultadoAccion"/>
        /// <seealso cref="TipoResultado"/>
        /// <seealso cref="TipoMensaje"/>
        public ResultadoAccion ValidarDatosModificacionUsuario(LAPI.Data.Model.Usuario datosUsuario)
        {
            logger.Debug("[ValidarDatosModificacionUsuario] Comienzo");
            logger.Debug("[ValidarDatosModificacionUsuario] Datos:" + datosUsuario);

            ResultadoAccion res = new ResultadoAccion();

            try
            {
                //0. Comprobamos que no falten campos:
                List<String> camposVacios = new List<String>();
                String mensaje = "Falta completar los siguientes campos: <ul>";
                if (datosUsuario.Nombre == null || String.Empty.Equals(datosUsuario.Nombre))
                {
                    camposVacios.Add("Nombre");
                    mensaje += "<li>" + LAPI.Core.StringExtension.GetFieldValue(datosUsuario.GetType(), "Nombre") + "</li>";
                }
                if (datosUsuario.Apellido == null || String.Empty.Equals(datosUsuario.Apellido))
                {
                    camposVacios.Add("Apellido");
                    mensaje += "<li>" + LAPI.Core.StringExtension.GetFieldValue(datosUsuario.GetType(), "Apellido") + "</li>";
                }
                if (datosUsuario.Apellido2 == null || String.Empty.Equals(datosUsuario.Apellido2))
                {
                    camposVacios.Add("Apellido2");
                    mensaje += "<li>" + LAPI.Core.StringExtension.GetFieldValue(datosUsuario.GetType(), "Apellido2") + "</li>";
                }
                if (datosUsuario.DNI == null || String.Empty.Equals(datosUsuario.DNI))
                {
                    camposVacios.Add("DNI");
                    mensaje += "<li>" + LAPI.Core.StringExtension.GetFieldValue(datosUsuario.GetType(), "DNI") + "</li>";
                }                
                if (datosUsuario.Email == null || String.Empty.Equals(datosUsuario.Email))
                {
                    camposVacios.Add("Email");
                    mensaje += "<li>" + LAPI.Core.StringExtension.GetFieldValue(datosUsuario.GetType(), "Email") + "</li>";
                }
                mensaje += "</ul>";

                if (camposVacios.Count != 0)
                {
                    res.addMensaje(mensaje: mensaje, tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //2. Comprobamos el formato del DNI
                LAPI.Business.Utilidades.NumeroNif validacion = LAPI.Business.Utilidades.NumeroNif.CompruebaNif(datosUsuario.DNI);
                if (!validacion.EsCorrecto)
                {
                    res.addMensaje(mensaje: "El DNI, no es correcto.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //3. Comprobamos el formato del email
                LAPI.Business.Utilidades.CompruebaMail mailValidate = new Utilidades.CompruebaMail();
                if (!mailValidate.IsValidEmail(datosUsuario.Email))
                {
                    res.addMensaje(mensaje: "El email, no es correcto.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                Gestores.GestorUsuarios oUsuarios = new Gestores.GestorUsuarios();

                //4. Comprobamos que no exista otro usuario con ese email                
                if (!oUsuarios.ComprobarEmail(datosUsuario: datosUsuario))
                {
                    res.addMensaje(mensaje: "Ya existe un usuario registrado con ese email.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //5. Comprobamos que no exista otro usuario con ese dni
                if (!oUsuarios.ComprobarDNI(datosUsuario: datosUsuario))
                {
                    res.addMensaje(mensaje: "Ya existe un usuario registrado con ese DNI", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //TODO OK
                res.setResultado(TipoResultado.CORRECTO);
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                res.addMensaje(mensaje: "No ha sido posible validar los datos del usuario.", tipoMensaje: TipoMensaje.ERROR);
                res.setResultado(TipoResultado.ERROR);
            }

            logger.Debug("[ValidarDatosModificacionUsuario] Fin");
            return res;
        }
    }
}
